#include <opencv2/opencv.hpp>
#include <iostream>

using namespace cv;
using namespace std;

// 全局变量
int hMin = 0, sMin = 0, vMin = 0;
int hMax = 179, sMax = 255, vMax = 255;
Mat frame, hsvFrame, mask;

// 回调函数，用于处理滑块变化
void onTrackbar(int, void *)
{
    Scalar lowerb(hMin, sMin, vMin);
    Scalar upperb(hMax, sMax, vMax);
    inRange(hsvFrame, lowerb, upperb, mask);
    imshow("Mask", mask);
}
// min  H:51     S:234       V:110
// MAX  H:125    S:255       V:254
int main()
{
    // 打开摄像头
    VideoCapture cap(0);
    if (!cap.isOpened())
    {
        cout << "无法打开摄像头" << endl;
        return -1;
    }
    cap.set(cv::CAP_PROP_FRAME_WIDTH, 640);
    cap.set(cv::CAP_PROP_FRAME_HEIGHT, 480);

    // 创建窗口
    namedWindow("Camera Feed", WINDOW_AUTOSIZE);
    namedWindow("Mask", WINDOW_AUTOSIZE);

    // 创建滑块
    createTrackbar("H Min", "Mask", &hMin, 179, onTrackbar);
    createTrackbar("S Min", "Mask", &sMin, 255, onTrackbar);
    createTrackbar("V Min", "Mask", &vMin, 255, onTrackbar);
    createTrackbar("H Max", "Mask", &hMax, 179, onTrackbar);
    createTrackbar("S Max", "Mask", &sMax, 255, onTrackbar);
    createTrackbar("V Max", "Mask", &vMax, 255, onTrackbar);

    while (true)
    {
        // 读取一帧
        cap >> frame;
        if (frame.empty())
        {
            cout << "Could not read frame!" << endl;
            break;
        }

        // 转换为HSV颜色空间
        cvtColor(frame, hsvFrame, COLOR_BGR2HSV);

        // 调用回调函数更新掩码
        onTrackbar(0, 0);

        // 显示原始图像
        imshow("Camera Feed", frame);
        // imshow("mask", mask);
        // 按下ESC键退出循环
        if (waitKey(1) == 27)
        {
            break;
        }
    }

    // 释放摄像头并关闭窗口
    cap.release();
    destroyAllWindows();

    return 0;
}
